home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / misc / dspice0s / moseq3.c < prev    next >
C/C++ Source or Header  |  1992-11-21  |  22KB  |  689 lines

  1. /* moseq3.f -- translated by f2c (version of 3 February 1990  3:36:42).
  2.    You must link the resulting object file with the libraries:
  3.     -lF77 -lI77 -lm -lc   (in that order)
  4. */
  5.  
  6. #include "f2c.h"
  7.  
  8. /* Common Block Declarations */
  9.  
  10. struct {
  11.     doublereal vto, beta, gamma, phi, phib, cox, xnsub, xnfs, xd, xj, xld, 
  12.         xlamda, uo, uexp, vbp, utra, vmax, xneff, xl, xw, vbi, von, vdsat,
  13.          qspof, beta0, beta1, cdrain, xqco, xqc, fnarrw, fshort;
  14.     integer lev;
  15. } mosarg_;
  16.  
  17. #define mosarg_1 mosarg_
  18.  
  19. struct {
  20.     doublereal omega, time, delta, delold[7], ag[7], vt, xni, egfet, xmu, 
  21.         sfactr;
  22.     integer mode, modedc, icalc, initf, method, iord, maxord, noncon, iterno, 
  23.         itemno, nosolv, modac, ipiv, ivmflg, ipostp, iscrch, iofile;
  24. } status_;
  25.  
  26. #define status_1 status_
  27.  
  28. struct {
  29.     doublereal twopi, xlog2, xlog10, root2, rad, boltz, charge, ctok, gmin, 
  30.         reltol, abstol, vntol, trtol, chgtol, eps0, epssil, epsox, pivtol,
  31.          pivrel;
  32. } knstnt_;
  33.  
  34. #define knstnt_1 knstnt_
  35.  
  36. /*<       subroutine moseq3(vds,vbs,vgs,gm,gds,gmbs, >*/
  37. /*<      1   qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
  38. /* Subroutine */ int moseq3_(vds, vbs, vgs, gm, gds, gmbs, qg, qc, qb, cggb, 
  39.     cgdb, cgsb, cbgb, cbdb, cbsb)
  40. doublereal *vds, *vbs, *vgs, *gm, *gds, *gmbs, *qg, *qc, *qb, *cggb, *cgdb, *
  41.     cgsb, *cbgb, *cbdb, *cbsb;
  42. {
  43.     /* Initialized data */
  44.  
  45.     static doublereal coeff0 = .0631353;
  46.     static doublereal coeff1 = .8013292;
  47.     static doublereal coeff2 = -.01110777;
  48.  
  49.     /* System generated locals */
  50.     doublereal d_1, d_2;
  51.  
  52.     /* Builtin functions */
  53.     double sqrt(), exp();
  54.  
  55.     /* Local variables */
  56.     static doublereal arga, argc, argb, onfg, emax, vdsc, vbin, vbix, vpof, 
  57.         onxj, onxl, onxn, vdsx, vgsx;
  58.     extern /* Subroutine */ int mosq3_();
  59.     static doublereal dadvb, dbdvb, diddl;
  60. #define alpha ((doublereal *)&mosarg_1 + 11)
  61.     static doublereal fgate, dgdvb, dgdvg, dgdvd, dldvd, cdsat, dldem, gdsat, 
  62.         fbody, wfact;
  63. #define theta ((doublereal *)&mosarg_1 + 14)
  64.     static doublereal phibs, delxl, ondvt, vdsat1, sqphs3, dfbdvb, dfddvb;
  65.     static integer icharg;
  66.     static doublereal dfgdvd, dfgdvb, dfgdvg, dfsdvb, gammas, dqbdvb, cdonco, 
  67.         xn, dsqdvb;
  68. #define xkappa ((doublereal *)&mosarg_1 + 15)
  69.     static doublereal dwpdvb, fbodys, onfbdy, djonxj, qbonco, sqphbs, dvtdvd, 
  70.         sqphis, wconxj, dvtdvb, csonco, dxndvb, dvodvd, dvodvb, us, 
  71.         xjonxl, dvsdvg, dvsdvd, wponxj, dvsdvb, onvdsc, dvsdga, dcodvg, 
  72.         dcodvd, dcodvb, cdnorm, cd1, fdrain, fd2, dfddvg, dfddvd, gdoncd, 
  73.         gdonfd, gdonfg, emoncd, emongd, demdvg, demdvd, demdvb, ddldvg, 
  74.         ddldvd, ddldvb, dlonxl, xlfact;
  75.     extern /* Subroutine */ int mqspof_();
  76.     static doublereal gamasd, cdo;
  77. #define eta ((doublereal *)&mosarg_1 + 13)
  78.     static doublereal vgb, vfb, wcs, gms, vth, gmw, wps, gds0, wcs2;
  79.  
  80. /*<       implicit double precision (a-h,o-z) >*/
  81.  
  82. /*     this routine evaluates the drain current, its derivatives and */
  83. /*     the charges associated with the gate, channel and bulk */
  84. /*     for mosfets based on semi-empirical equations */
  85.  
  86. /* spice version 2g.6  sccsid=mosarg 3/15/83 */
  87. /*<       common /mosarg/ vto,beta,gamma,phi,phib,cox,xnsub,xnfs,xd,xj,xld, >*/
  88. /*<      1   xlamda,uo,uexp,vbp,utra,vmax,xneff,xl,xw,vbi,von,vdsat,qspof, >*/
  89. /*<      2   beta0,beta1,cdrain,xqco,xqc,fnarrw,fshort,lev >*/
  90. /* spice version 2g.6  sccsid=status 3/15/83 */
  91. /*<       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, >*/
  92. /*<      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon, >*/
  93. /*<      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile >*/
  94. /* spice version 2g.6  sccsid=knstnt 3/15/83 */
  95. /*<       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, >*/
  96. /*<      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox, >*/
  97. /*<      2   pivtol,pivrel >*/
  98.  
  99. /*<       equivalence (xlamda,alpha),(vbp,theta),(uexp,eta),(utra,xkappa) >*/
  100. /*<       data coeff0/0.0631353d0/,coeff1/0.8013292d0/,coeff2/-0.01110777d0/ >*/
  101.  
  102. /*     icharg=1 causes charges to be computed */
  103. /*     icharg=0 bypasses the computation of charges */
  104.  
  105. /*     icharg=1 */
  106. /*     if (mode.ne.1) go to 10 */
  107. /*     icharg=0 */
  108. /*     if (modedc.eq.2.and.nosolv.ne.0) icharg=1 */
  109. /*     if (initf.eq.4) icharg=1 */
  110.  
  111. /*     reference cdrain equations to source and */
  112. /*     charge equations to bulk */
  113.  
  114. /*< 10    continue >*/
  115. /* L10: */
  116. /*<       icharg=0 >*/
  117.     icharg = 0;
  118. /*<       vgb=vgs-vbs >*/
  119.     vgb = *vgs - *vbs;
  120. /*<       vfb=vbi-phi >*/
  121.     vfb = mosarg_1.vbi - mosarg_1.phi;
  122. /*<       vdsat=0.0d0 >*/
  123.     mosarg_1.vdsat = 0.;
  124. /*<       qg=0.0d0 >*/
  125.     *qg = 0.;
  126. /*<       qb=0.0d0 >*/
  127.     *qb = 0.;
  128. /*<       qc=0.0d0 >*/
  129.     *qc = 0.;
  130. /*<       cgdb=0.0d0 >*/
  131.     *cgdb = 0.;
  132. /*<       cbdb=0.0d0 >*/
  133.     *cbdb = 0.;
  134. /*<       onxl=1.0d0/xl >*/
  135.     onxl = 1. / mosarg_1.xl;
  136. /*<       eta=eta/(xl*xl*xl) >*/
  137.     *eta /= mosarg_1.xl * mosarg_1.xl * mosarg_1.xl;
  138.  
  139. /* .....square root term */
  140.  
  141. /*<       if ( vbs.gt.0.0d0 ) go to 120 >*/
  142.     if (*vbs > 0.) {
  143.     goto L120;
  144.     }
  145. /*<       phibs=phi-vbs >*/
  146.     phibs = mosarg_1.phi - *vbs;
  147. /*<       sqphbs=dsqrt(phibs) >*/
  148.     sqphbs = sqrt(phibs);
  149. /*<       dsqdvb=-0.5d0/sqphbs >*/
  150.     dsqdvb = -.5 / sqphbs;
  151. /*<       go to 200 >*/
  152.     goto L200;
  153. /*< 120   continue >*/
  154. L120:
  155. /*<       sqphis=dsqrt(phi) >*/
  156.     sqphis = sqrt(mosarg_1.phi);
  157. /*<       sqphs3=phi*sqphis >*/
  158.     sqphs3 = mosarg_1.phi * sqphis;
  159. /*<       sqphbs=sqphis/(1.0d0+vbs/(phi+phi)) >*/
  160.     sqphbs = sqphis / (*vbs / (mosarg_1.phi + mosarg_1.phi) + 1.);
  161. /*<       phibs=sqphbs*sqphbs >*/
  162.     phibs = sqphbs * sqphbs;
  163. /*<       dsqdvb=-phibs/(sqphs3+sqphs3) >*/
  164.     dsqdvb = -phibs / (sqphs3 + sqphs3);
  165.  
  166. /* .....short channel effect factor */
  167.  
  168. /*< 200   continue >*/
  169. L200:
  170. /*<       if ( (xj.eq.0.0d0).or.(xd.eq.0.0d0) ) go to 210 >*/
  171.     if (mosarg_1.xj == 0. || mosarg_1.xd == 0.) {
  172.     goto L210;
  173.     }
  174. /*<       wps=xd*sqphbs >*/
  175.     wps = mosarg_1.xd * sqphbs;
  176. /*<       onxj=1.0d0/xj >*/
  177.     onxj = 1. / mosarg_1.xj;
  178. /*<       xjonxl=xj*onxl >*/
  179.     xjonxl = mosarg_1.xj * onxl;
  180. /*<       djonxj=xld*onxj >*/
  181.     djonxj = mosarg_1.xld * onxj;
  182. /*<       wponxj=wps*onxj >*/
  183.     wponxj = wps * onxj;
  184. /*<       wconxj=coeff0+coeff1*wponxj+coeff2*wponxj*wponxj >*/
  185.     wconxj = coeff0 + coeff1 * wponxj + coeff2 * wponxj * wponxj;
  186. /*<       wcs=wconxj*xj >*/
  187.     wcs = wconxj * mosarg_1.xj;
  188. /*<       arga=wconxj+djonxj >*/
  189.     arga = wconxj + djonxj;
  190. /*<       argc=wponxj/(1.0d0+wponxj) >*/
  191.     argc = wponxj / (wponxj + 1.);
  192. /*<       argb=dsqrt(1.0d0-argc*argc) >*/
  193.     argb = sqrt(1. - argc * argc);
  194. /*<       fshort=1.0d0-xjonxl*(arga*argb-djonxj) >*/
  195.     mosarg_1.fshort = 1. - xjonxl * (arga * argb - djonxj);
  196. /*<       dwpdvb=xd*dsqdvb >*/
  197.     dwpdvb = mosarg_1.xd * dsqdvb;
  198. /*<       dadvb=(coeff1+coeff2*(wponxj+wponxj))*dwpdvb*onxj >*/
  199.     dadvb = (coeff1 + coeff2 * (wponxj + wponxj)) * dwpdvb * onxj;
  200. /*<       dbdvb=-argc*argc*(1.0d0-argc)*dwpdvb/(argb*wps) >*/
  201.     dbdvb = -argc * argc * (1. - argc) * dwpdvb / (argb * wps);
  202. /*<       dfsdvb=-xjonxl*(dadvb*argb+arga*dbdvb) >*/
  203.     dfsdvb = -xjonxl * (dadvb * argb + arga * dbdvb);
  204. /*<       go to 220 >*/
  205.     goto L220;
  206. /*< 210   continue >*/
  207. L210:
  208. /*<       fshort=1.0d0 >*/
  209.     mosarg_1.fshort = 1.;
  210. /*<       dfsdvb=0.0d0 >*/
  211.     dfsdvb = 0.;
  212. /*<       wcs=0.05d-6 >*/
  213.     wcs = 5e-8;
  214.  
  215. /* .....body effect */
  216.  
  217. /*< 220   continue >*/
  218. L220:
  219. /*<       gammas=gamma*fshort >*/
  220.     gammas = mosarg_1.gamma * mosarg_1.fshort;
  221. /*<       fbodys=0.5d0*gammas/(sqphbs+sqphbs) >*/
  222.     fbodys = gammas * .5 / (sqphbs + sqphbs);
  223. /*<       fbody=fbodys+fnarrw >*/
  224.     fbody = fbodys + mosarg_1.fnarrw;
  225. /*<       onfbdy=1.0d0/(1.0d0+fbody) >*/
  226.     onfbdy = 1. / (fbody + 1.);
  227. /*<       dfbdvb=-fbodys*dsqdvb/sqphbs+fbodys*dfsdvb/fshort >*/
  228.     dfbdvb = -fbodys * dsqdvb / sqphbs + fbodys * dfsdvb / mosarg_1.fshort;
  229. /*<       qbonco=gammas*sqphbs+fnarrw*phibs >*/
  230.     qbonco = gammas * sqphbs + mosarg_1.fnarrw * phibs;
  231. /*<       dqbdvb=gammas*dsqdvb+gamma*dfsdvb*sqphbs-fnarrw >*/
  232.     dqbdvb = gammas * dsqdvb + mosarg_1.gamma * dfsdvb * sqphbs - 
  233.         mosarg_1.fnarrw;
  234.  
  235. /* .....static feedback effect */
  236.  
  237. /*<       vbix=vbi-eta*vds >*/
  238.     vbix = mosarg_1.vbi - *eta * *vds;
  239.  
  240. /* .....threshold voltage */
  241.  
  242. /*<       vth=vbix+qbonco >*/
  243.     vth = vbix + qbonco;
  244. /*<       dvtdvd=-eta >*/
  245.     dvtdvd = -(*eta);
  246. /*<       dvtdvb=dqbdvb >*/
  247.     dvtdvb = dqbdvb;
  248.  
  249. /* .....joint weak inversion and strong inversion */
  250.  
  251. /*<       von=vth >*/
  252.     mosarg_1.von = vth;
  253. /*<       if ( xnfs.eq.0.0d0 ) go to 250 >*/
  254.     if (mosarg_1.xnfs == 0.) {
  255.     goto L250;
  256.     }
  257. /*<            csonco=charge*xnfs*xl*xw/cox >*/
  258.     csonco = knstnt_1.charge * mosarg_1.xnfs * mosarg_1.xl * mosarg_1.xw / 
  259.         mosarg_1.cox;
  260. /*<            cdonco=qbonco/(phibs+phibs) >*/
  261.     cdonco = qbonco / (phibs + phibs);
  262. /*<            xn=1.0d0+csonco+cdonco >*/
  263.     xn = csonco + 1. + cdonco;
  264. /*<            von=vth+vt*xn >*/
  265.     mosarg_1.von = vth + status_1.vt * xn;
  266. /*<            dxndvb=dqbdvb/(phibs+phibs)-qbonco*dsqdvb/(phibs*sqphbs) >*/
  267.     dxndvb = dqbdvb / (phibs + phibs) - qbonco * dsqdvb / (phibs * sqphbs);
  268. /*<            dvodvd=dvtdvd >*/
  269.     dvodvd = dvtdvd;
  270. /*<            dvodvb=dvtdvb+vt*dxndvb >*/
  271.     dvodvb = dvtdvb + status_1.vt * dxndvb;
  272. /*<            go to 300 >*/
  273.     goto L300;
  274.  
  275. /* .....cutoff region */
  276.  
  277. /*< 250   continue >*/
  278. L250:
  279. /*<       if ( vgs.gt.von ) go to 300 >*/
  280.     if (*vgs > mosarg_1.von) {
  281.     goto L300;
  282.     }
  283. /*<       cdrain=0.0d0 >*/
  284.     mosarg_1.cdrain = 0.;
  285. /*<       gm=0.0d0 >*/
  286.     *gm = 0.;
  287. /*<       gds=0.0d0 >*/
  288.     *gds = 0.;
  289. /*<       gmbs=0.0d0 >*/
  290.     *gmbs = 0.;
  291. /*<       if ( icharg.ne.0 ) go to 800 >*/
  292.     if (icharg != 0) {
  293.     goto L800;
  294.     }
  295. /*<       go to 1000 >*/
  296.     goto L1000;
  297.  
  298. /* .....device is on */
  299.  
  300. /*< 300   continue >*/
  301. L300:
  302. /*<       vgsx=dmax1(vgs,von) >*/
  303.     vgsx = max(*vgs,mosarg_1.von);
  304.  
  305. /* .....mobility modulation by gate voltage */
  306.  
  307. /*<       onfg=1.0d0+theta*(vgsx-vth) >*/
  308.     onfg = *theta * (vgsx - vth) + 1.;
  309. /*<       fgate=1.0d0/onfg >*/
  310.     fgate = 1. / onfg;
  311. /*<       us=uo*fgate >*/
  312.     us = mosarg_1.uo * fgate;
  313. /*<       dfgdvg=-theta*fgate*fgate >*/
  314.     dfgdvg = -(*theta) * fgate * fgate;
  315. /*<       dfgdvd=-dfgdvg*dvtdvd >*/
  316.     dfgdvd = -dfgdvg * dvtdvd;
  317. /*<       dfgdvb=-dfgdvg*dvtdvb >*/
  318.     dfgdvb = -dfgdvg * dvtdvb;
  319.  
  320. /* .....saturation voltage */
  321.  
  322. /*<       vdsat=(vgsx-vth)*onfbdy >*/
  323.     mosarg_1.vdsat = (vgsx - vth) * onfbdy;
  324. /*<       vpof=vdsat >*/
  325.     vpof = mosarg_1.vdsat;
  326. /*<       if ( vmax.gt.0.0d0 ) go to 310 >*/
  327.     if (mosarg_1.vmax > 0.) {
  328.     goto L310;
  329.     }
  330. /*<       dvsdvg=onfbdy >*/
  331.     dvsdvg = onfbdy;
  332. /*<       dvsdvd=-dvsdvg*dvtdvd >*/
  333.     dvsdvd = -dvsdvg * dvtdvd;
  334. /*<       dvsdvb=-dvsdvg*dvtdvb-vdsat*dfbdvb*onfbdy >*/
  335.     dvsdvb = -dvsdvg * dvtdvb - mosarg_1.vdsat * dfbdvb * onfbdy;
  336. /*<       go to 400 >*/
  337.     goto L400;
  338. /*<   310 vdsc=xl*vmax/us >*/
  339. L310:
  340.     vdsc = mosarg_1.xl * mosarg_1.vmax / us;
  341. /*<       onvdsc=1.0d0/vdsc >*/
  342.     onvdsc = 1. / vdsc;
  343. /*<       arga=(vgsx-vth)*onfbdy >*/
  344.     arga = (vgsx - vth) * onfbdy;
  345. /*<       argb=dsqrt(arga*arga+vdsc*vdsc) >*/
  346.     argb = sqrt(arga * arga + vdsc * vdsc);
  347. /*<       vdsat=arga+vdsc-argb >*/
  348.     mosarg_1.vdsat = arga + vdsc - argb;
  349. /*<       dvsdga=(1.0d0-arga/argb)*onfbdy >*/
  350.     dvsdga = (1. - arga / argb) * onfbdy;
  351. /*<       dvsdvg=dvsdga-(1.0d0-vdsc/argb)*vdsc*dfgdvg*onfg >*/
  352.     dvsdvg = dvsdga - (1. - vdsc / argb) * vdsc * dfgdvg * onfg;
  353. /*<       dvsdvd=-dvsdvg*dvtdvd >*/
  354.     dvsdvd = -dvsdvg * dvtdvd;
  355. /*<       dvsdvb=-dvsdvg*dvtdvb-arga*dvsdga*dfbdvb >*/
  356.     dvsdvb = -dvsdvg * dvtdvb - arga * dvsdga * dfbdvb;
  357.  
  358. /* .....current factors in linear region */
  359.  
  360. /*< 400   continue >*/
  361. L400:
  362. /*<       vdsx=dmin1(vds,vdsat) >*/
  363.     vdsx = min(*vds,mosarg_1.vdsat);
  364. /*<       if ( vdsx.eq.0.0d0 ) go to 900 >*/
  365.     if (vdsx == 0.) {
  366.     goto L900;
  367.     }
  368. /*<       cdo=vgsx-vth-0.5d0*(1.0d0+fbody)*vdsx >*/
  369.     cdo = vgsx - vth - (fbody + 1.) * .5 * vdsx;
  370. /*<       dcodvg=1.0d0 >*/
  371.     dcodvg = 1.;
  372. /*<       if (vds.lt.vdsat) dcodvd=-dvtdvd-0.5d0*(1.0d0+fbody) >*/
  373.     if (*vds < mosarg_1.vdsat) {
  374.     dcodvd = -dvtdvd - (fbody + 1.) * .5;
  375.     }
  376. /*<       dcodvb=-dvtdvb-0.5d0*dfbdvb*vdsx >*/
  377.     dcodvb = -dvtdvb - dfbdvb * .5 * vdsx;
  378.  
  379. /* .....normalized drain current */
  380.  
  381. /*< 410   continue >*/
  382. /* L410: */
  383. /*<       cdnorm=cdo*vdsx >*/
  384.     cdnorm = cdo * vdsx;
  385. /*<       gm=vdsx >*/
  386.     *gm = vdsx;
  387. /*<       gds=vgsx-vth-(1.0d0+fbody+dvtdvd)*vdsx >*/
  388.     *gds = vgsx - vth - (fbody + 1. + dvtdvd) * vdsx;
  389. /*<       gmbs=dcodvb*vdsx >*/
  390.     *gmbs = dcodvb * vdsx;
  391.  
  392. /* .....drain current without velocity saturation effect */
  393.  
  394. /*<       cd1=beta*cdnorm >*/
  395.     cd1 = mosarg_1.beta * cdnorm;
  396. /*<       beta=beta*fgate >*/
  397.     mosarg_1.beta *= fgate;
  398. /*<       cdrain=beta*cdnorm >*/
  399.     mosarg_1.cdrain = mosarg_1.beta * cdnorm;
  400. /*<       gm=beta*gm+dfgdvg*cd1 >*/
  401.     *gm = mosarg_1.beta * *gm + dfgdvg * cd1;
  402. /*<       gds=beta*gds+dfgdvd*cd1 >*/
  403.     *gds = mosarg_1.beta * *gds + dfgdvd * cd1;
  404. /*<       gmbs=beta*gmbs >*/
  405.     *gmbs = mosarg_1.beta * *gmbs;
  406.  
  407. /* .....velocity saturation factor */
  408.  
  409. /*<       if ( vmax.eq.0.0d0 ) go to 500 >*/
  410.     if (mosarg_1.vmax == 0.) {
  411.     goto L500;
  412.     }
  413. /*<       fdrain=1.0d0/(1.0d0+vdsx*onvdsc) >*/
  414.     fdrain = 1. / (vdsx * onvdsc + 1.);
  415. /*<       fd2=fdrain*fdrain >*/
  416.     fd2 = fdrain * fdrain;
  417. /*<       arga=fd2*vdsx*onvdsc*onfg >*/
  418.     arga = fd2 * vdsx * onvdsc * onfg;
  419. /*<       dfddvg=-dfgdvg*arga >*/
  420.     dfddvg = -dfgdvg * arga;
  421. /*<       dfddvd=-dfgdvd*arga-fd2*onvdsc >*/
  422.     dfddvd = -dfgdvd * arga - fd2 * onvdsc;
  423. /*<       dfddvb=-dfgdvb*arga >*/
  424.     dfddvb = -dfgdvb * arga;
  425.  
  426. /* .....drain current */
  427.  
  428. /*<       gm=fdrain*gm+dfddvg*cdrain >*/
  429.     *gm = fdrain * *gm + dfddvg * mosarg_1.cdrain;
  430. /*<       gds=fdrain*gds+dfddvd*cdrain >*/
  431.     *gds = fdrain * *gds + dfddvd * mosarg_1.cdrain;
  432. /*<       gmbs=fdrain*gmbs+dfddvb*cdrain >*/
  433.     *gmbs = fdrain * *gmbs + dfddvb * mosarg_1.cdrain;
  434. /*<       cdrain=fdrain*cdrain >*/
  435.     mosarg_1.cdrain = fdrain * mosarg_1.cdrain;
  436. /*<       beta=beta*fdrain >*/
  437.     mosarg_1.beta *= fdrain;
  438.  
  439. /* .....channel length modulation */
  440.  
  441. /*< 500   continue >*/
  442. L500:
  443. /*<       if ( vds.le.vdsat ) go to 700 >*/
  444.     if (*vds <= mosarg_1.vdsat) {
  445.     goto L700;
  446.     }
  447. /*<       if ( vmax.eq.0.0d0 ) go to 510 >*/
  448.     if (mosarg_1.vmax == 0.) {
  449.     goto L510;
  450.     }
  451. /*<       if (alpha.eq.0.0d0) go to 700 >*/
  452.     if (*alpha == 0.) {
  453.     goto L700;
  454.     }
  455. /*<       cdsat=cdrain >*/
  456.     cdsat = mosarg_1.cdrain;
  457. /*<       gdsat=cdsat*(1.0d0-fdrain)*onvdsc >*/
  458.     gdsat = cdsat * (1. - fdrain) * onvdsc;
  459. /*<       gdsat=dmax1(1.0d-12,gdsat) >*/
  460.     gdsat = max(1e-12,gdsat);
  461. /*<       gdoncd=gdsat/cdsat >*/
  462.     gdoncd = gdsat / cdsat;
  463. /*<       gdonfd=gdsat/(1.0d0-fdrain) >*/
  464.     gdonfd = gdsat / (1. - fdrain);
  465. /*<       gdonfg=gdsat*onfg >*/
  466.     gdonfg = gdsat * onfg;
  467. /*<       dgdvg=gdoncd*gm-gdonfd*dfddvg+gdonfg*dfgdvg >*/
  468.     dgdvg = gdoncd * *gm - gdonfd * dfddvg + gdonfg * dfgdvg;
  469. /*<       dgdvd=gdoncd*gds-gdonfd*dfddvd+gdonfg*dfgdvd >*/
  470.     dgdvd = gdoncd * *gds - gdonfd * dfddvd + gdonfg * dfgdvd;
  471. /*<       dgdvb=gdoncd*gmbs-gdonfd*dfddvb+gdonfg*dfgdvb >*/
  472.     dgdvb = gdoncd * *gmbs - gdonfd * dfddvb + gdonfg * dfgdvb;
  473.  
  474. /*<       emax=cdsat*onxl/gdsat >*/
  475.     emax = cdsat * onxl / gdsat;
  476. /*<       emoncd=emax/cdsat >*/
  477.     emoncd = emax / cdsat;
  478. /*<       emongd=emax/gdsat >*/
  479.     emongd = emax / gdsat;
  480. /*<       demdvg=emoncd*gm-emongd*dgdvg >*/
  481.     demdvg = emoncd * *gm - emongd * dgdvg;
  482. /*<       demdvd=emoncd*gds-emongd*dgdvd >*/
  483.     demdvd = emoncd * *gds - emongd * dgdvd;
  484. /*<       demdvb=emoncd*gmbs-emongd*dgdvb >*/
  485.     demdvb = emoncd * *gmbs - emongd * dgdvb;
  486.  
  487. /*<       arga=0.5d0*emax*alpha >*/
  488.     arga = emax * .5 * *alpha;
  489. /*<       argc=xkappa*alpha >*/
  490.     argc = *xkappa * *alpha;
  491. /*<       argb=dsqrt(arga*arga+argc*(vds-vdsat)) >*/
  492.     argb = sqrt(arga * arga + argc * (*vds - mosarg_1.vdsat));
  493. /*<       delxl=argb-arga >*/
  494.     delxl = argb - arga;
  495. /*<       dldvd=argc/(argb+argb) >*/
  496.     dldvd = argc / (argb + argb);
  497. /*<       dldem=0.5d0*(arga/argb-1.0d0)*alpha >*/
  498.     dldem = (arga / argb - 1.) * .5 * *alpha;
  499. /*<       ddldvg=dldem*demdvg >*/
  500.     ddldvg = dldem * demdvg;
  501. /*<       ddldvd=dldem*demdvd-dldvd >*/
  502.     ddldvd = dldem * demdvd - dldvd;
  503. /*<       ddldvb=dldem*demdvb >*/
  504.     ddldvb = dldem * demdvb;
  505. /*<       go to 520 >*/
  506.     goto L520;
  507. /*< 510   continue >*/
  508. L510:
  509. /*<       delxl=dsqrt(xkappa*(vds-vdsat)*alpha) >*/
  510.     delxl = sqrt(*xkappa * (*vds - mosarg_1.vdsat) * *alpha);
  511. /*<       dldvd=0.5d0*delxl/(vds-vdsat) >*/
  512.     dldvd = delxl * .5 / (*vds - mosarg_1.vdsat);
  513. /*<       ddldvg=0.0d0 >*/
  514.     ddldvg = 0.;
  515. /*<       ddldvd=-dldvd >*/
  516.     ddldvd = -dldvd;
  517. /*<       ddldvb=0.0d0 >*/
  518.     ddldvb = 0.;
  519.  
  520. /* .....punch through approximation */
  521.  
  522. /*< 520   continue >*/
  523. L520:
  524. /*<       if ( delxl.le.(0.5d0*xl) ) go to 600 >*/
  525.     if (delxl <= mosarg_1.xl * .5) {
  526.     goto L600;
  527.     }
  528. /*<       wcs2=wcs*wcs >*/
  529.     wcs2 = wcs * wcs;
  530. /*<       delxl=xl-(xl**2/(4.0d0*delxl)) >*/
  531. /* Computing 2nd power */
  532.     d_1 = mosarg_1.xl;
  533.     delxl = mosarg_1.xl - d_1 * d_1 / (delxl * 4.);
  534. /*<       arga=4.0d0*(xl-delxl)**2/xl**2 >*/
  535. /* Computing 2nd power */
  536.     d_1 = mosarg_1.xl - delxl;
  537. /* Computing 2nd power */
  538.     d_2 = mosarg_1.xl;
  539.     arga = d_1 * d_1 * 4. / (d_2 * d_2);
  540. /*<       ddldvg=ddldvg*arga >*/
  541.     ddldvg *= arga;
  542. /*<       ddldvd=ddldvd*arga >*/
  543.     ddldvd *= arga;
  544. /*<       ddldvb=ddldvb*arga >*/
  545.     ddldvb *= arga;
  546. /*<        dldvd= dldvd*arga >*/
  547.     dldvd *= arga;
  548.  
  549. /* .....saturation region */
  550.  
  551. /*< 600   continue >*/
  552. L600:
  553. /*<       dlonxl=delxl*onxl >*/
  554.     dlonxl = delxl * onxl;
  555. /*<       xlfact=1.0d0/(1.0d0-dlonxl) >*/
  556.     xlfact = 1. / (1. - dlonxl);
  557. /*<       cdrain=cdrain*xlfact >*/
  558.     mosarg_1.cdrain *= xlfact;
  559. /*<       diddl=cdrain/(xl-delxl) >*/
  560.     diddl = mosarg_1.cdrain / (mosarg_1.xl - delxl);
  561. /*<       gm=gm*xlfact+diddl*ddldvg >*/
  562.     *gm = *gm * xlfact + diddl * ddldvg;
  563. /*<       gds0=gds*xlfact+diddl*ddldvd >*/
  564.     gds0 = *gds * xlfact + diddl * ddldvd;
  565. /*<       gmbs=gmbs*xlfact+diddl*ddldvb >*/
  566.     *gmbs = *gmbs * xlfact + diddl * ddldvb;
  567. /*<       gm=gm+gds0*dvsdvg >*/
  568.     *gm += gds0 * dvsdvg;
  569. /*<       gmbs=gmbs+gds0*dvsdvb >*/
  570.     *gmbs += gds0 * dvsdvb;
  571. /*<       gds=gds0*dvsdvd+diddl*dldvd >*/
  572.     *gds = gds0 * dvsdvd + diddl * dldvd;
  573.  
  574. /* .....finish strong inversion case */
  575.  
  576. /*< 700   continue >*/
  577. L700:
  578. /*<       if ( vgs.ge.von ) go to 750 >*/
  579.     if (*vgs >= mosarg_1.von) {
  580.     goto L750;
  581.     }
  582.  
  583. /* .....weak inversion */
  584.  
  585. /*<                 onxn=1.0d0/xn >*/
  586.     onxn = 1. / xn;
  587. /*<                 ondvt=onxn/vt >*/
  588.     ondvt = onxn / status_1.vt;
  589. /*<                 wfact=dexp( (vgs-von)*ondvt ) >*/
  590.     wfact = exp((*vgs - mosarg_1.von) * ondvt);
  591. /*<                 cdrain=cdrain*wfact >*/
  592.     mosarg_1.cdrain *= wfact;
  593. /*<                 gms=gm*wfact >*/
  594.     gms = *gm * wfact;
  595. /*<                 gmw=cdrain*ondvt >*/
  596.     gmw = mosarg_1.cdrain * ondvt;
  597. /*<                 gm=gmw >*/
  598.     *gm = gmw;
  599. /*<                 if (vds.gt.vdsat) gm=gm+gds0*dvsdvg*wfact >*/
  600.     if (*vds > mosarg_1.vdsat) {
  601.     *gm += gds0 * dvsdvg * wfact;
  602.     }
  603. /*<                 gds=gds*wfact+(gms-gmw)*dvodvd >*/
  604.     *gds = *gds * wfact + (gms - gmw) * dvodvd;
  605. /*<                 gmbs=gmbs*wfact+(gms-gmw)*dvodvb >*/
  606. /*<      1                         -gmw*(vgs-von)*onxn*dxndvb >*/
  607.     *gmbs = *gmbs * wfact + (gms - gmw) * dvodvb - gmw * (*vgs - mosarg_1.von)
  608.          * onxn * dxndvb;
  609.  
  610. /* .....charge computation */
  611.  
  612. /*<   750 continue >*/
  613. L750:
  614. /*<       if (icharg.eq.0) go to 1000 >*/
  615.     if (icharg == 0) {
  616.     goto L1000;
  617.     }
  618. /*<       if (vgs.le.vth) go to 800 >*/
  619.     if (*vgs <= vth) {
  620.     goto L800;
  621.     }
  622. /*<       call mqspof(vds,vbs,vgs,vpof,vdsat1,vth,vbin,gamasd, >*/
  623. /*<      1   qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
  624.     mqspof_(vds, vbs, vgs, &vpof, &vdsat1, &vth, &vbin, &gamasd, qg, qc, qb, 
  625.         cggb, cgdb, cgsb, cbgb, cbdb, cbsb);
  626. /*<       go to 2000 >*/
  627.     goto L2000;
  628.  
  629. /* .....charge computation for vgs<vth */
  630.  
  631. /*< 800   continue >*/
  632. L800:
  633. /*<       xqc=xqco >*/
  634.     mosarg_1.xqc = mosarg_1.xqco;
  635. /*<       call mosq3(vds,vbs,vpof,vdsat1,vth,vbin,gamasd,cox,phi, >*/
  636. /*<      1   qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
  637.     mosq3_(vds, vbs, &vpof, &vdsat1, &vth, &vbin, &gamasd, &mosarg_1.cox, &
  638.         mosarg_1.phi, qg, qc, qb, cggb, cgdb, cgsb, cbgb, cbdb, cbsb);
  639. /*<       qspof=0.0d0 >*/
  640.     mosarg_1.qspof = 0.;
  641. /*<       go to 2000 >*/
  642.     goto L2000;
  643.  
  644. /* .....special case of vds=0.0d0 */
  645.  
  646. /*< 900   continue >*/
  647. L900:
  648. /*<       beta=beta*fgate >*/
  649.     mosarg_1.beta *= fgate;
  650. /*<       cdrain=0.0d0 >*/
  651.     mosarg_1.cdrain = 0.;
  652. /*<       gm=0.0d0 >*/
  653.     *gm = 0.;
  654. /*<       gds=beta*(vgsx-vth) >*/
  655.     *gds = mosarg_1.beta * (vgsx - vth);
  656. /*<       gmbs=0.0d0 >*/
  657.     *gmbs = 0.;
  658. /*<            if ( (xnfs.ne.0.0d0).and.(vgs.lt.von) ) >*/
  659. /*<      1          gds=gds*dexp((vgs-von)/(vt*xn)) >*/
  660.     if (mosarg_1.xnfs != 0. && *vgs < mosarg_1.von) {
  661.     *gds *= exp((*vgs - mosarg_1.von) / (status_1.vt * xn));
  662.     }
  663. /*<       if (icharg.eq.0) go to 1000 >*/
  664.     if (icharg == 0) {
  665.     goto L1000;
  666.     }
  667. /*<       call mosq3(vds,vbs,vpof,vdsat1,vth,vbin,gamasd,cox,phi, >*/
  668. /*<      1   qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
  669.     mosq3_(vds, vbs, &vpof, &vdsat1, &vth, &vbin, &gamasd, &mosarg_1.cox, &
  670.         mosarg_1.phi, qg, qc, qb, cggb, cgdb, cgsb, cbgb, cbdb, cbsb);
  671. /*< 1000  qspof=0.0d0 >*/
  672. L1000:
  673.     mosarg_1.qspof = 0.;
  674.  
  675. /* .....done */
  676.  
  677. /*<  2000 return >*/
  678. L2000:
  679.     return 0;
  680. /*<       end >*/
  681. } /* moseq3_ */
  682.  
  683. #undef eta
  684. #undef xkappa
  685. #undef theta
  686. #undef alpha
  687.  
  688.  
  689.